﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Persistencia;
using GestorDeFlotasModelo.Entities;
using System.Data.SqlClient;
using Persistencia.Interfaces;

namespace GestorDeFlotasModelo.Factorias
{
    public class FactoriaUsuario : Factoria, IIdentityFactory
    {
         private FactoriaUsuario(TransaccionBase tran)
            : base(tran)
        {
        }
     

        public override string NombreTabla
        {
            get { return " NUESTRA_RUBIA_ES_MEJOR.Usuario "; }
        }

        protected override IPersistibleModelo NuevoPersistible(HashTableNCSensitive htsNc)
        {
            return new Usuario();
        }

        protected override string Id(HashTableNCSensitive hts)
        {
            return hts["Usuario_Id"].ToString();
        }

        public Usuario SelectUsuario(string username)
        {
            SqlCommand comm = new SqlCommand();
            comm.CommandText = "SELECT * FROM "+this.NombreTabla+" WHERE Usuario_Username=@Usuario_Username";
            comm.Parameters.AddWithValue("@Usuario_Username", username);

            List<Usuario> usuarios = base.Select<Usuario>(comm, delegate(IPersistibleModelo iPer) { return ((Usuario)iPer).Username == username; });

            if (usuarios.Count > 0)
                return usuarios[0];
            else
                return null;
        }

        public List<Usuario> SelectPorUserName(string username)
        {
            SqlCommand comm = new SqlCommand();
            comm.CommandText = "SELECT * FROM " + this.NombreTabla + " WHERE Usuario_Username LIKE '%@Usuario_Username%'";
            comm.Parameters.AddWithValue("@Usuario_Username", username);

            List<Usuario> usuarios = base.Select<Usuario>(comm, delegate(IPersistibleModelo iPer) { return ((Usuario)iPer).Username.ToLower().Contains(username.ToLower()); });

            if (usuarios.Count > 0)
                return usuarios;
            else
                return new List<Usuario>();
        }

        protected override HashTableNCSensitive ParametrosClave()
        {
            HashTableNCSensitive parameters = new HashTableNCSensitive();
            parameters.Add("Usuario_Id", null);
            return parameters;
        }

        protected override HashTableNCSensitive ParametrosNoClave()
        {
            HashTableNCSensitive parameters = new HashTableNCSensitive();
            parameters.Add("Usuario_Username", null);
            parameters.Add("Usuario_Password", null);
            parameters.Add("Usuario_Habilitado", null);
            parameters.Add("Usuario_IntentosFallidos", null);
            parameters.Add("Usuario_AvisadoInconsistencias", null);
            return parameters;
        }


        protected override Predicate<IPersistibleModelo> FiltroXId(string id)
        {
            return delegate(IPersistibleModelo iPer)
            {
                return ((Usuario)iPer).Id == long.Parse(id);
            };
        }

        public Usuario Nuevo(string userName, string password, bool habilitado, int intentosFallidos, List<Rol> roles)
        {
            Usuario a = new Usuario();
            a.Habilitado = habilitado;
            a.IntentosFallidos = intentosFallidos;
            a.Password = password;
            a.Username = userName;
            a.AvisadoInconsistenciasViajes = false;
            base.Agregar(a);            
            return a;
        }
    }
}
